package com.vercon.commonmirror.utils;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Created by csh on 2021/1/15
 * 线程池使用
 * Executors.newCachedThreadPool()
 * 因为没有核心线程，其他全为非核心线程，SynchronousQueue是不存储元素的，每次插入操作必须伴随一个移除操作，一个移除操作也要伴随一个插入操作。
 * 当一个任务执行时，先用SynchronousQueue的offer提交任务，如果线程池中有线程空闲，则调用SynchronousQueue的poll方法来移除任务并交给线程处理；如果没有线程空闲，则开启一个新的非核心线程来处理任务。
 * 由于maximumPoolSize是无界的，所以如果线程处理任务速度小于提交任务的速度，则会不断地创建新的线程，这时需要注意不要过度创建，应采取措施调整双方速度，不然线程创建太多会影响性能。
 * 从其特点可以看出，CachedThreadPool适用于有大量需要立即执行的耗时少的任务的情况。
 */
public class ThreadUtil {
    private static ThreadUtil threadUtil;
    private ExecutorService mExecutorService;

    public static ThreadUtil getInstance() {
        if (threadUtil == null) {
            synchronized (ThreadUtil.class) {
                if (threadUtil == null) {
                    threadUtil = new ThreadUtil();
                }
            }
        }
        return threadUtil;
    }

    public ExecutorService getExecutorService() {
        if (mExecutorService == null) {
            mExecutorService = Executors.newCachedThreadPool();
        }
        return mExecutorService;
    }
} 